unit MeiosPagamento;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Buttons, StdCtrls, Mask, ComCtrls, ShellApi;

type
  TFormMeiosPagto = class(TForm)
    BT1: TButton;
    BT2: TButton;
    BT3: TButton;
    StatusBar1: TStatusBar;
    GroupBox1: TGroupBox;
    Label1: TLabel;
    Label2: TLabel;
    MaskEdit1: TMaskEdit;
    MaskEdit2: TMaskEdit;
    BTOK: TBitBtn;
    BTCancel: TBitBtn;
    ProgressBar1: TProgressBar;
    procedure BT1Click(Sender: TObject);
    procedure BT2Click(Sender: TObject);
    procedure BT3Click(Sender: TObject);
    procedure BTOKClick(Sender: TObject);
    procedure MaskEdit1Exit(Sender: TObject);
    procedure MaskEdit2Exit(Sender: TObject);
    procedure MaskEdit1KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure MaskEdit2KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure BTCancelClick(Sender: TObject);
    procedure FormActivate(Sender: TObject);
  private
    { Private declarations }
        procedure TrataArquivoMFD;
        procedure ImprimeRelatorioGerencial;
  public
    { Public declarations }
  end;

var
  FormMeiosPagto: TFormMeiosPagto;
  nomearq:String;
  resposta:Integer;
  LegendaPagamento: Array[0..59] of string;
  ValorPagamento: Array[0..59] of Real;
  TOTAL_MeiosPagamento: Array[0..59] of string;
  TOTAL_ValorPagamento: Array[0..59] of Real;
  Relatorio:TRichEdit;
  DataArquivo:String;
  Novadata: TDateTime;

implementation

uses Principal, declaracoes, funcoesapoio;

{$R *.dfm}

procedure TFormMeiosPagto.BT1Click(Sender: TObject);
var pDir:Pchar;
begin
      if  MessageDlg('Esta função deverá capturar as informações do ECF no momento'+chr(13)+
                     'do registro dos itens e armazenar no Banco de Dados.' + chr(13) +
                     ' ' +Chr(13)+
                     'Para saber quais funções utilizar, oriente-se pelo Anexo VI do seguinte'+chr(13)+
                     'documento: "Funções Sweda para a implementação do PAF-ECF v01.06.pdf"' +chr (13) +
                     ' ' + chr(13)+
                     'Deseja abrir este documento agora?'
                     , mtConfirmation, [mbYes, mbNo], 0)= mrYes then
      begin


              GetMem(pDir,256);
              StrPCopy(pDir, ExtractFilePath(Application.ExeName)); {Aqui vc coloca o caminho do arquivo}
              ShellExecute(0, nil, 'Funções Sweda para a implementação do PAF-ECF v01.06.pdf', nil, pDir, SW_NORMAL);
              FreeMem(pdir,256);
      end;


end;

procedure TFormMeiosPagto.BT2Click(Sender: TObject);
begin
      MessageDlg('O layout do Ato Cotepe 17/04 se assemelha ao layout do arquivo'+chr(13)+
                 '"Movimento por ECF". Alguns registros contém informações que apenas'+chr(13)+
                 'o software aplicativo possui, então neste exemplo, estes campos ficarão'+char(13)+
                 'com espaços. Oriente-se pelo código fonte.', mtInformation, [mbOK], 0);
      GroupBox1.Visible:=True;

end;

procedure TFormMeiosPagto.BT3Click(Sender: TObject);
begin
        Close;
end;

procedure TFormMeiosPagto.TrataArquivoMFD;
var ArquivoCotepe:TextFile;
    linha: array[0..512] of char;
    indice, percorre:Integer;
    InserirCabecalho:Boolean;
begin
        nomearq:='C:\SWEDA\COTEPE.TXT';

        If not FileExists(Nomearq) then begin
                StatusBar1.Panels[0].Text:='Arquivo de relatório não localizado';
                exit;
        end;

        StatusBar1.Panels[0].Text:='Gerando Relatório de Meios de Pagamento...';
        Statusbar1.Refresh;
        for indice:=0 to 59 do LegendaPagamento[indice]:=#0;
        for indice:=0 to 59 do ValorPagamento[indice]:=0;

        InserirCabecalho:=False;
        AssignFile(ArquivoCotepe, NomeArq);
        Reset(ArquivoCotepe);
        While not EOF(ArquivoCotepe) do begin
                ReadLn(ArquivoCotepe,linha);
                if pos('E21',Linha)<>0 then begin
                   InserirCabecalho:=True;
                   for indice:= 0 to 59 do
                   begin
                          if LegendaPagamento[indice]= copy(linha,65,15) then begin
                                ValorPagamento[Indice]:=ValorPagamento[Indice]+(StrToInt(copy(linha,80,13)));
                                for percorre:=0 to 59 do begin
                                          if TOTAL_MeiosPagamento[percorre]= copy(linha,65,15) then begin
                                                TOTAL_ValorPagamento[percorre]:=TOTAL_ValorPagamento[percorre]+(StrToInt(copy(linha,80,13)));
                                                break;
                                        end;
                                        if TOTAL_MeiosPagamento[percorre] = #0 then begin
                                                TOTAL_MeiosPagamento[percorre]:=copy(linha,65,15);
                                                TOTAL_ValorPagamento[percorre]:=StrToFloat(copy(linha,80,13));
                                                break;
                                        end
                                end;
                                break;
                          end;
                          if LegendaPagamento[indice] = #0 then begin
                                   LegendaPagamento[Indice]:=copy(linha,65,15);
                                   ValorPagamento[Indice]:=StrToFloat(copy(linha,80,13));
                                for percorre:=0 to 59 do begin
                                          if TOTAL_MeiosPagamento[percorre]= copy(linha,65,15) then begin
                                                TOTAL_ValorPagamento[percorre]:=TOTAL_ValorPagamento[percorre]+(StrToInt(copy(linha,80,13)));
                                                break;
                                        end;
                                        if TOTAL_MeiosPagamento[percorre] = #0 then begin
                                                TOTAL_MeiosPagamento[percorre]:=copy(linha,65,15);
                                                TOTAL_ValorPagamento[percorre]:=StrToFloat(copy(linha,80,13));
                                                break;
                                        end
                                end;

                                   break;
                          end;

                   end;
                end;
        end;
        CloseFile(ArquivoCotepe);
        Refresh;
   if InserirCabecalho then begin
           Relatorio.Lines.Add(#16+'B'+#16+'C'+'         Movimento de '+DataArquivo);
           Relatorio.Lines.Add(#16+'N'+'      Descrição         Tipo            Valor');

           for indice:=0 to 19 do begin
                if LegendaPagamento[indice]<>#0 then
                   Relatorio.Lines.Add(#16+'N'+'     '+Format('%15s',[LegendaPagamento[indice]])+'    CF     '+Format('%13.2f',[ValorPagamento[Indice]/100]));
           end;
           Relatorio.Lines.Add(' ');
   end;
end;


procedure TFormMeiosPagto.BTOKClick(Sender: TObject);
var varre:integer;
    primeiravez, continua:Boolean;
    dias:Real;
    tipo:char;
begin
        FormPrincipal.Statusbar1.Panels[0].Text:='Meios de Pagto ...';
        StatusBar1.Panels[0].Text:='Aguarde...'; Refresh;
        Dias:=StrToDate(MaskEdit2.Text)-StrToDate(MaskEdit1.Text);
        ProgressBar1.Position:=0;
        ProgressBar1.Min:=0;
        ProgressBar1.Max:=StrToInt(FloattoStr(dias));
        for varre:=0 to 59 do TOTAL_MeiosPagamento[varre]:=#0;
        for varre:=0 to 59 do TOTAL_ValorPagamento[varre]:=0;

        Continua :=True;
        PrimeiraVez:=True;
        DataArquivo := MaskEdit1.Text;
        Resposta:=ECF_DownloadMF('C:\SWEDA\MFiscal.BIN');
        Tipo:='3';
        While Continua do
        begin
                ProgressBar1.Position:=ProgressBar1.Position+1;
                ProgressBar1.Refresh;
                nomearq:='C:\SWEDA\COTEPE.TXT';
                StatusBar1.Panels[0].Text:='Aguarde...'; Refresh;
                Resposta:=ECF_ReproduzirMemoriaFiscalMFD(tipo,DataArquivo, DataArquivo,nomearq,'C:\SWEDA\MFiscal.BIN'); WaitProcess;
                if Resposta=-27 then VerificaRetornoFuncao(Resposta);
                if Resposta=-8 then begin
                        StatusBar1.Panels[0].Text:='Falha na geração do arquivo';
                        exit;
                end;
                if resposta=1 then StatusBar1.Panels[0].Text:='Arquivo gerado '+nomearq;
                // a primeira geração faz com tipo 3. Neste caso se nao houver
                // o arquivo binario da MFD fará o download
                // o tipo 4 não tenta fazer o download da MFD;
                tipo:='4';
                if  primeiravez then begin
                        //Monta Relatorio
                           Relatorio:=TRichEdit.Create(self);
                           Relatorio.Parent := Twincontrol(FormMeiosPagto);
                           Relatorio.Visible := False;
                           Relatorio.Width := 500;
                           Relatorio.Font.Name := 'Courier New';
                           Relatorio.Lines.Clear;
                           Relatorio.Align := alClient;
                           Relatorio.Lines.Add(' ');
                           Relatorio.Lines.Add(#16+'E'+'   MEIOS DE PAGAMENTO');
                           Relatorio.Lines.Add('   ');
                           Relatorio.Lines.Add(#16+'C'+'Período de '+MaskEdit1.Text+' até '+MaskEdit2.Text);
                           PrimeiraVez:=False;
                end;
                TrataArquivoMFD;
                DeleteFile(nomearq);

                NovaData:= StrtoDate(DataArquivo) + 1;
                dataarquivo:=FormatDateTime('dd/mm/yyyy',NovaData);
                if StrToDAte(dataArquivo) > StrToDate(MaskEdit2.Text) then
                        Continua:=false;

        end;
        Relatorio.Lines.Add(#16+'C'+'     =======================================');
        Relatorio.Lines.Add(#16+'B'+'                TOTAL DO PERÍODO');
        Relatorio.Lines.Add(#16+'C'+'     =======================================');
        for Varre:=0 to 19 do begin
        if TOTAL_MeiosPagamento[varre]<>#0 then
           Relatorio.Lines.Add('     '+Format('%15s',[TOTAL_MeiosPagamento[varre]])+'         '+Format('%15.2f',[TOTAL_ValorPagamento[varre]/100]));
   end;
   ImprimeRelatorioGerencial;
   VerificaRetornoFuncao(Resposta);
   GroupBox1.Visible:=False;

end;

procedure TFOrmMeiosPagto.ImprimeRelatorioGerencial;
var i:integer;
begin
        Resposta:=ECF_AbreRelatorioGerencial();
        if Resposta =1 then begin
        i:=1;
        While i<Length(Relatorio.Text) do
        begin
                Resposta:=ECF_RelatorioGerencial(Copy(Relatorio.Text,i,600));
                i:=i+600;
        end;
        end;
        Resposta:=ECF_FechaRelatorioGerencial();

end;
procedure TFormMeiosPagto.MaskEdit1Exit(Sender: TObject);
begin
                try
                        StrToDate(MaskEdit1.Text)
                except
                        ShowMessage('Data inválida!');
                        MaskEdit1.SetFocus;
                end;

end;

procedure TFormMeiosPagto.MaskEdit2Exit(Sender: TObject);
begin
                try
                        StrToDate(MaskEdit2.Text)
                except
                        ShowMessage('Data inválida!');
                        MaskEdit2.SetFocus;
                end;
                if strtodate(maskedit1.Text)>strtodate(maskedit2.Text) then
                begin
                        Showmessage('Data inicial não pode ser maior que a data final');
                        MaskEdit2.SetFocus;
                end;

end;

procedure TFormMeiosPagto.MaskEdit1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
       if Key = VK_RETURN then MaskEdit2.SetFocus;

end;

procedure TFormMeiosPagto.MaskEdit2KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
       if Key = VK_RETURN then BTOK.SetFocus;
end;

procedure TFormMeiosPagto.BTCancelClick(Sender: TObject);
begin
   GroupBox1.Visible:=False;

end;

procedure TFormMeiosPagto.FormActivate(Sender: TObject);
begin
        ProgressBar1.Position:=0;
end;

end.
